package com.bjpowernode.controller;


import com.bjpowernode.pojo.ProductInfo;
import com.bjpowernode.pojo.vo.ProductInfoVo;
import com.bjpowernode.service.ProductInfoService;
import com.bjpowernode.utils.FileNameUtil;
import com.github.pagehelper.PageInfo;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.Date;

@Controller
@RequestMapping("prod")
@SuppressWarnings("all")
public class ProductInfoAction {

    private static int PAGE_SIZE = 2;

    String file_TypeName = null;// 很细节的东西

    @Autowired
    private ProductInfoService productInfoService;

    /*
        怎么跳到这里：
                    1，主页点击“商品管理”访问这个接口
                    2，保存商品后，跳转到这里，不传参数。所以默认显示第一页
                    3，editViewShow.action：给session传递"toPage"，告诉得到第几页商品的信息

     */
    @RequestMapping("split")
    public String split(Model model, HttpSession session) {
        PageInfo pageInfo = null;

        Integer page = (Integer) session.getAttribute("toPage");// editViewShow和deleteBatch 给的

        if (page != null) {
            // 1，商品修改完后或这update.jsp点击“取消”，要回到该商品所在的页面
            pageInfo = productInfoService.splitbyPage(page, PAGE_SIZE);
            // 进入预先的分页后，这里的“page”要去掉。不然后面点击“商品管理”，还是回到这一页
            session.removeAttribute("toPage");
        } else {
            // 2，添加商品完成后，直接回到第一页
            pageInfo = productInfoService.splitPage(1, PAGE_SIZE);
        }

        model.addAttribute("info", pageInfo);

        return "product";

    }

    //    上传图片
    @ResponseBody
    @RequestMapping("addImgWithAJAX")
    public Object addImgWithAJAX(MultipartFile pimage, HttpServletRequest request) throws IOException {
        // eee3985f19d04d929c6ae566f7d49003.png
        file_TypeName = FileNameUtil.getUUIDFileName() + FileNameUtil.getFileType(pimage.getOriginalFilename());

        String path = request.getServletContext().getRealPath("/image_big"); // 要加 / 。不然不在image_big里！
//        F:\研究生工作学习资料\台式电脑的学习总结\mimissm项目\xiaomiFuXi\target\xiaomiFuXi-1.0-SNAPSHOT\image_big
//        System.out.println(path);
        pimage.transferTo(new File(path + File.separator + file_TypeName));

        pimage.transferTo(new File("F:\\研究生工作学习资料\\台式电脑的学习总结\\mimissm项目\\" +
                "xiaomiFuXi\\src\\main\\webapp\\image_big\\" + file_TypeName));//image_big\\ 两个\\ 要写！

//        图片回显,前端有 “imgurl” 字段 。
//        前端用：http://localhost:8080/mimiSSM_war/image_big/423rwef23523wr.png 加载图片
        JSONObject jsonObject = new JSONObject();// 狂神也讲了。    JSONArray
        jsonObject.put("imgurl", file_TypeName);
        return jsonObject.toString();
    }

    @RequestMapping("save")
    public String save(ProductInfo productInfo, HttpServletRequest request) {
        // 前端传来： pName pContent pPrice pNumber  typeId
        // pImage pDate手动赋值

        // 添加商品：点击 “提交”之前，我们已经点击“浏览”，图片通过“ajaxImg”以上上传，后台得到"file_TypeName"的全部变量（图片名字），
        //    这里把此值，需要存到数据库"p_image"字段里。
        productInfo.setpImage(file_TypeName);
        productInfo.setpDate(new Date());
        // 不写这个的话，A商品上传的图片，会在更新B商品（不更新图片）的情况下，自动给B上传这个图片。
        file_TypeName = "";

        System.out.println();
        System.out.println("save 的file_TypeName:" + file_TypeName);
        System.out.println();

        int save = productInfoService.save(productInfo);
        if (save > 0)
            request.setAttribute("msg", "增加成功");// product.jsp 的alert “msg”
        else
            request.setAttribute("msg", "增加失败");

        // 相当于点击”商品管理“。“msg”是product.jsp里的，若不空，就alert “msg”。所以有对话框：“添加商品成功”
        return "forward:split.action";
    }

    // 点击”编辑“，进入编辑页面，并展示商品所有信息
    @RequestMapping("editViewShow")
    public String editViewShow(int pid, int page, Model model, HttpSession session) {
//        vo: 得到前端给的：page页面。到时候更新成功，还是显示当前页的商品信息

        ProductInfo productInfo = productInfoService.getById(pid);
        model.addAttribute("prod", productInfo);
        session.setAttribute("toPage", page);
        return "update";
    }

    //    前端点击“提交”，后端更新商品并且回到当前商品所在页面
    @RequestMapping("update")
    public String update(ProductInfo productInfo, HttpServletRequest request, Model model) {
        // 前端给：pName pContent pPrice pNumber typeId
        // 剩下的 pImage 和 pDate 后台设置  （注意：后台上传图片功能仅仅是吧图片上传到服务器，并没有给productInfo 属性赋值。）
        // 数据库需要用productInfo 属性给字段赋值
        System.out.println(productInfo.toString());

        productInfo.setpDate(new Date());

        // 解释：如果照片修改了，就加入mysql。如果没有修改照片，为什么是“”
        //
        // 如果更新了图片，数据库p_image字段改成新图片名就行
        if (!"".equals(file_TypeName)) {
            System.out.println(file_TypeName);
            productInfo.setpImage(file_TypeName); // file_TypeName总是刚刚上传的图片名称
        }

        System.out.println();
        System.out.println("file_TypeName:" + file_TypeName);//d31cfcd0ca284963bec849e4102e834a.jpg
        System.out.println();

        int update = productInfoService.update(productInfo);
        if (update > 0) {
            model.addAttribute("msg", "更新成功");// 用request也行。

        } else {
            model.addAttribute("msg", "更新失败");
        }
        // 更新A商品后，置“”，B商品就不会受到A商品的影响！！
            /*
                    之前的Bug，    file_TypeName只能在update.action才会置“”，如果新增A商品包括图片，file_TypeName!=""，
                                然后更新B商品，不更改照片。后台会直接把A照片复制到数据库里的B商品
                                修改办法：save.action。file_TypeName加入mysql后，file_TypeName = “”;

                    正确东西： 但是B商品更新完后（先不说B照片是否存在1，的问题），file_TypeName = “”，
                            a, 此时C商品更新了图片：file_TypeName ！= “”
                            b, 若C没有更新图片，file_TypeName = “”
             */
        file_TypeName = "";
        return "forward:split.action";
    }


    //    下面点击第几页显示第几页商品。  四个条件的查询
    //      但是如果是显示“四个查询”结果，下面点击的分页商品展示，要符合"限制的商品条件"
    // 下面的分页和上面的四条件查询，是有联系的！
    @ResponseBody
    @RequestMapping("splitWithToPageAndQueryToPage")
    public void splitWithToPageAndQueryToPage(ProductInfoVo vo, HttpSession session) {
        // 如果是“四条件查询”，前端没有传“page”，默认：1
        // 如果是下面点击的分页，前端会传“page
        PageInfo pageInfo = productInfoService.splitPageVo(vo, PAGE_SIZE);
//        System.out.println(vo.toString());
        session.setAttribute("info", pageInfo);
    }

    // 我的方式
    @ResponseBody
    @RequestMapping("delete")
    public Object delete(int pid, ProductInfoVo vo, HttpServletRequest request, HttpSession session) {
        String image = productInfoService.getById(pid).getpImage();// 先查后删，不是先删后查！

        int del = productInfoService.delete(pid);

        // 图片的删除：和删除成功与否没关系
        if (image != null) {
            File file = new File("F:\\研究生工作学习资料\\台式电脑的学习总结\\mimissm项目\\" +
                    "xiaomiFuXi\\src\\main\\webapp\\image_big\\" + image);
            boolean delete = file.delete();
            System.out.println("图片是否删除：" + delete);
            // 这里不删除target的图片，下次启动项目后，图片是依据项目里来的
        }

        if (del > 0) {
            request.setAttribute("msgg", "删除成功");
        } else {
            request.setAttribute("msgg", "删除失败");
        }

        System.out.println();
        System.out.println(request.getAttribute("msgg"));
        System.out.println();

        PageInfo<ProductInfo> pageInfo = productInfoService.splitPageVo(vo, PAGE_SIZE);
        session.setAttribute("info", pageInfo);// 前端的“info”是这里的session给的！
        return request.getAttribute("msgg");// ajax异步请求，要给前端成功后的参数
    }

    //    批量删除
    @ResponseBody
    @RequestMapping("deleteBatch")
    public Object deleteBatch(String pids, ProductInfoVo vo, HttpServletRequest request) {
        //vo 只有前端传来的：page
        String[] split = pids.split(",");

        // 删除照片
        for (String s : split) {
            ProductInfo byId = productInfoService.getById(Integer.parseInt(s));
            String image = byId.getpImage();
            if (image != "") {
                File file = new File("F:\\研究生工作学习资料\\台式电脑的学习总结\\" +
                        "mimissm项目\\xiaomiFuXi\\src\\main\\webapp\\image_big\\" + image);
                file.delete();
            }
        }

        int dels = productInfoService.deleteBatch(split);
        if (dels > 0) {
            request.setAttribute("msgg", "批量删除成功");//
        } else {
            request.setAttribute("msgg", "批量删除失败");
        }
        PageInfo pageInfo = productInfoService.splitPageVo(vo,PAGE_SIZE);
        request.getSession().setAttribute("info",pageInfo);// 前段拿着新的“info"局部刷新product.jsp
        return request.getAttribute("msgg");// 前端拿着“msg” 进行 alert
    }
}
